Var
	 s,err:word;
	    en:boolean;
{-----------------------------------------}
Function gts:char;
BEGIN
gts:=tab_ras[getnit];
END;
{-----------------------------------------}
Procedure F; Forward;
{-----------------------------------------}
Procedure T;
Begin
 F;
 case getkll of
  'R':begin end;
  'S':begin
       case getnit of
	2,3,4,5,6,7,16:er('Ошибка в выражении',5);
       end;
      end;
   else
    er('Ошибка в выражении',5);
 end; {case}

 while (gts<>';') and (gts<>')') and (gts<>'+')
       and (gts<>'-') and (gts<>',') and (gts<>':')
       and (gts<>'>') and (gts<>'=') and (gts<>'<')
       and (getkll<>'S') do
 begin
   {PUSH AX} gencodbyte($50);
  if gts='*' then
		   begin
		    nextl;
		    F;
	  {POP BX}  gencodbyte($5b);
	 {iMUL BX}  gencodbyte($f7);
		    gencodbyte($EB);
		   end
	    else
  if gts='/' then
		   begin
		    nextl;
		    F;
	 {MOV BX,AX}gencodbyte($89);gencodbyte($c3);
	 {POP AX}   gencodbyte($58);
	 {XOR DX}   gencodbyte($31);gencodbyte($d2);
	{iDIV BX}   gencodbyte($f7);gencodbyte($FB);
		   end;
  end; {while}
 End;
{-----------------------------------------}
Procedure E;
Begin
 T;
 case getkll of
  'R':begin end;
  'S':begin
       case getnit of
	2,3,4,5,6,7,16:er('Ошибка в выражении',5);
       end;
      end;
   else
    er('Ошибка в выражении',5);
 end; {case}

 while (gts<>';') and (gts<>')') and (gts<>',')
   and (gts<>'>') and (gts<>'=') and (gts<>'<')
	 and (getkll<>'S') and (gts<>':') do
  begin
    {PUSH AX}	gencodbyte($50);
  if gts='+' then
		   begin
		      nextl;
		      T;
	   {POP BX}   gencodbyte($5B);
	   {ADD AX,BX}gencodbyte($01);gencodbyte($D8);
		   end
	    else
  if gts='-' then
		   begin
		    nextl;
		     T;
	   {POP BX}	 gencodbyte($5b);
	   {SUB BX,AX}	 gencodbyte($29);gencodbyte($c3);
	   {MOV BX,AX}gencodbyte($89);gencodbyte($D8);
		   end;
   end;
 End;
{-----------------------------------------}
procedure F;
Var
 nm:word;
Begin
 case getkll of
  'R':begin
       if gts='(' then
		 begin
		   nextl;
		   E;
		   if gts<> ')' then
		     er('Ошибка в выражении',5)
		       else nextl;
		 end else
		  if en and (gts='-')
		    then begin
		       gencodbyte($B8);
		       gencodword(0);
			 end
		   else er('Ошибка в выражении',5);
      end;
  'D':begin
       val(tab_int[getnit],s,err);
       gencodbyte($B8);
       gencodword(s);
       nextl;
      end;
  'I':begin {id}
	if tp[getnit].iname=0
	 then er('Неизвестная переменная',5);
       case tp[getnit].itype[1] of
	'I':begin {I}
	     gencodbyte($A1);
	     gencodword(tp[getnit].addr);
	     nextl;
	    end;   {I}
	'B':begin {B}
	     gencodbyte($31);gencodbyte($C0);
	     gencodbyte($A0);
	     gencodword(tp[getnit].addr);
	     nextl;
	    end;  {B}
	'D':begin {DIM}
	     nm:=getnit;
	     nextl;
	     if (getkll<>'R') or (getnit<>7)
	      then er('Ожидался разделитель `(`',5);
	     F;
	     {теперь  AX число - ИНДЕКС МАССИВА}
	     case tp[nm].itype[2] of
	      'I':begin {DI}
		   gencodbyte($BB);gencodword(tp[nm].size);
		   gencodbyte($E8);gencodword(-(adc+2-$288));

		   gencodbyte($BB);gencodword($0002);
		   gencodbyte($F7);gencodbyte($E3);
		   gencodbyte($BB);gencodword(tp[nm].addr);
		   gencodbyte($01);gencodbyte($C3);
		   gencodbyte($8B);gencodbyte($07);
	      { в AX значение элемента массива }
		  end;	{DI}
	  'B','C':begin {B}
		   gencodbyte($BB);gencodword(tp[nm].size);
		   gencodbyte($E8);gencodword(-(adc+2-$288));
		   gencodbyte($BB);gencodword(tp[nm].addr);
		   gencodbyte($01);gencodbyte($C3);
		   gencodbyte($31);gencodbyte($C0);
		   gencodbyte($8A);gencodbyte($07);
	      { в AL значение элемента массива }
		  end;	{B}
	      end;  {case tp[getnit].type[2] of}
	     end;  {DIM}
	  else er('Ошибка в выражении',5);
	end; {case tp[getnit].type[1] of}
       end {id}
     else er('Ошибка в выражении',5);
 end {case getkll of}
End;
{=========================================}